#include "client.h"

int recv_n(int fd, void *buf, int len)
{
    char *p = (char *)buf;
    int currentSize = 0;
    while (currentSize < len)
    {
        int ret = recv(fd, p + currentSize, len - currentSize, 0);
        //printf("recv_n:%d\n", ret);

        if (ret == -1)
        {
            perror("recv");
            return -1;
        }
        if (ret == 0)
        {
            return 0;
        }
        currentSize += ret;
    }
    return currentSize;
}

// int recv_file(int sockfd)
// {
//     // 接收一个服务端的回应
//     char buf[4096] = {0};
//     train_t data;
//     char filename[128] = {0};
//     off_t filesize = 0;
//     // 接收文件名
//     recv_n(sockfd, &data.train_len, sizeof(data.train_len));
//     recv_n(sockfd, data.train_data, data.train_len);
//     strcpy(filename, data.train_data);
//     printf("recv from server: %s\n", filename);
//     // 接收文件大小
//     recv_n(sockfd, &data.train_len, sizeof(data.train_len));
//     recv_n(sockfd, data.train_data, data.train_len);
//     memcpy(&filesize, data.train_data, data.train_len);
//     printf("recv from server: %ld\n", filesize);
//     // 接收文件
//     int fd = open(filename, O_CREAT | O_RDWR, 0664);
//     ERROR_CHECK(fd, -1, "open");
//     // 判断文件长度,并发送给服务端
//     struct stat st;
//     stat(filename, &st);
//     printf("filesize before trans is %ld\n", st.st_size);
//     data.train_len = sizeof(st.st_size);
//     memcpy(data.train_data, &st.st_size, data.train_len);
//     send(sockfd, &data, data.train_len + sizeof(data.train_len), 0);

//     //接收服务端的反馈，是否要对比哈希值
//     bzero(&data,sizeof(data));
//     int flag = -1;
//     recv_n(sockfd, &data.train_len, sizeof(data.train_len));
//     recv_n(sockfd, data.train_data, data.train_len);
//     memcpy(&flag, data.train_data, data.train_len);
//     if (flag == 0)//file is exist, but not same!
//     {
//         printf("file is exist, but not same!\n");
//         close(fd);
//         return -1;
//     }
//     else if (flag == 1)//file is not exist, start to recv!
//     {
//         printf("file is not exist, start to recv!\n");
//     }
//     else
//     {
//         printf("file is exist, and same!\n");
//         close(fd);
//         return 0;
//     }

//     recv_n(sockfd, &data.train_len, sizeof(data.train_len));
//     recv_n(sockfd, data.train_data, data.train_len);
//     unsigned char sha1_result[1024];
//     // unsigned 
//     char sha1_result_remote[1024];
//     memcpy(sha1_result_remote, data.train_data, data.train_len);
//     printf("sha1_result_remote = %s\n", sha1_result);
//     compute_hash(filename, sha1_result);
//     printf("sha1_result = %s\n", sha1_result);
//     if (strcmp((char *)sha1_result, sha1_result_remote) == 0)
//     {
//         printf("file is exist, and same!\n");
//         close(fd);
//         return 0;
//     }
//     else
//     {
//         printf("file is not same!\n");
//     }


//     // 分片，达到分片大小就刷新进度
//     int slice = filesize / 1000;
//     if (slice == 0)
//     {
//         slice = 1;
//     }
//     int oldslice = 0;
//     //printf("oldslice:%d\n", oldslice);
//     // 接收文件
//     int currentsize = 0;
//     int temSize = 0;
//     while (filesize > currentsize)
//     {
//         // printf("currentsize:%d\n", currentsize);
//         memset(buf,0,sizeof(buf));
//         int ret = recv_n(sockfd, &temSize, sizeof(temSize));
//         // printf("temSize:%d\n", temSize);
//         // printf("ret:%d\n", ret);

//         ret = recv_n(sockfd, buf, temSize);
//         //printf("ret:%d\n", ret);

//         if (ret == -1)
//         {
//             perror("recv");
//             return -1;
//         }
//         write(fd, buf, ret);
//         //printf("buf:%s\n", buf);
//         currentsize += ret;
//         if (currentsize - oldslice >= slice)
//         {
//             oldslice = currentsize;
//             //printf("currentSize: %d\n", currentsize);
//             printf("recv from server: %4ld%%\r", currentsize * 100 / filesize);
//             fflush(stdout);
//         }
//         fflush(stdout);
//     }
//     printf("\r%-40s\r", "");  // 清除当前行（填空格）后退光标

//     printf("recv over: 100%% !\n");

//     close(fd);
//     return 0;
// }